import numpy as np
from resume.models import ResumeTemplate

def search_templates_by_vector(query, model, topk=5):
    """
    通过向量相似度检索最相关的简历模板
    :param query: 用户输入的检索文本
    :param model: 向量化模型（如SentenceTransformer实例）
    :param topk: 返回最相关的前topk个模板
    :return: 最相关的模板列表
    """
    # 将用户输入的检索文本转为向量
    query_vec = model.encode(query)
    results = []  # 用于存放(相似度, 模板)元组
    # 遍历所有简历模板
    for template in ResumeTemplate.objects.all():
        # 如果该模板没有向量，跳过
        if not template.vector:
            continue
        # 从数据库中读取的二进制向量转为numpy数组
        vec = np.frombuffer(template.vector, dtype=np.float32)
        # 计算余弦相似度
        sim = np.dot(query_vec, vec) / (np.linalg.norm(query_vec) * np.linalg.norm(vec))
        # 保存相似度和模板对象
        results.append((sim, template))
    # 按相似度从高到低排序
    results.sort(reverse=True, key=lambda x: x[0])
    # 返回前topk个最相关的模板对象
    return [tpl for sim, tpl in results[:topk]]


def search_templates_by_keyword(query, topk=5):
    """
    用关键词包含方式检索简历模板（适合本地无向量模型时临时使用）
    :param query: 用户输入的检索文本
    :param topk: 返回前topk个结果
    :return: 模板列表
    """
    # 支持多关键词，空格分割
    keywords = query.strip().split()
    results = []
    for template in ResumeTemplate.objects.all():
        # 拼接模板的主要文本信息
        text = f"{template.name} {template.desc} {template.tags}"
        # 只要有一个关键词在文本中出现就算匹配
        if any(kw.lower() in text.lower() for kw in keywords):
            results.append(template)
    return results[:topk]
